﻿#pragma once
#include "libmesh/libmesh.h"
#include <vtkm/Hash.h>
#include <vtkm/Pair.h>
#include <vtkm/Types.h>

//namespace galois{
using vtkm::FloatDefault;
using vtkm::HashType;
using vtkm::Id;
using vtkm::Id2;
using vtkm::Id3;
using vtkm::IdComponent;
using vtkm::Pair;
using vtkm::UInt16;
using vtkm::UInt32;
using vtkm::UInt8;
using vtkm::Int8;
using vtkm::Vec2f;
using vtkm::Vec3f;

using vtkm::Vec;
using Real = vtkm::FloatDefault;
using RealGradient = vtkm::Vec3f;

// Id: 表示个数索引，第xx个
using SideId = vtkm::UInt8;
using ElemId = Id;
using BoundaryId = vtkm::Int16;

// Type: 表示类型索引，通常用在定义enum class
/*
	  enum class BCEnum : BCType
	  {
		  Far,
		  Wall,
		  Inlet,
		  Outlet
	  };

	  enum class BCEnum : ShapeType
	  {
		  tri3,
		  qaud4,
		  hex8,
		  line2
	  };
  */
using BCType = vtkm::UInt8;
using ShapeType = vtkm::UInt8;

// Type: 表示类型标签，通常作为模板参数，用作编译时多态的转发，内部包含enum用作类型擦除
/*
	struct BCTagFar
	{
	   static BCType type = BCEnum::Far;
	};

	struct BCTagWall
	{
	   static BCType type = BCEnum::Wall;
	}
	}
  */

//using BCTag = struct;
//using ShapeTag = struct;
//

//}
